Heroku スターターガイド (Python)
はじめに
このチュートリアルを実施して、Heroku プラットフォームの旧世代である Cedar にサンプル Python アプリをデプロイします。Heroku Private Spaces でのみ利用可能な Fir 世代にアプリをデプロイするには、こちらのガイドに従ってください。
このチュートリアルでは、以下が用意されていることを前提としています。
- 確認済みの Heroku アカウント
- ローカルにインストールされた Python バージョン 3.10 以上 (3.13 を推奨)。macOS、Windows、Linux のインストールガイドを参照してください。
- Eco dyno プランのサブスクリプション (推奨)
dyno とデータベースを使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。低料金プランを使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
設定する
Heroku Command Line Interface (CLI) をインストールします。CLI は、アプリの管理やスケール、アドオンのプロビジョニング、ログの表示、ローカルでのアプリの実行に使用できます。
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。Git がまだインストールされていない場合は、先に進む前に次の手順を完了してください。
ご使用のプラットフォーム用のインストーラをダウンロードし、実行してください。
Heroku CLI のその他のインストールオプションについては、こちらを参照してください。
インストール後、コマンドシェルで heroku
コマンドを使用できます。
Heroku CLI にログインするには、heroku login
コマンドを使用します。
$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
Opening browser to https://cli-auth.heroku.com/auth/cli/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as me@example.com
このコマンドにより、Web ブラウザで Heroku ログインページが開きます。ブラウザですでに Heroku にログインしている場合は、ページのログインボタンをクリックします。
この認証は、heroku
と git
コマンドが正常に動作するために必要な操作です。
Heroku CLI のインストールや使用に問題がある場合は、アドバイスとトラブルシューティングステップについて、Heroku CLI のメイン記事を参照してください。
外部の HTTP/HTTPS サービスへの接続にプロキシを使用するファイアウォールを利用している場合は、heroku
コマンドを実行する前に、ローカルの開発環境で HTTP_PROXY
または HTTPS_PROXY
環境変数を設定してください。
サンプルアプリを複製する
Heroku を初めて使う場合は、Heroku が提供するサンプルアプリケーションを使ってこのチュートリアルを行うことをお勧めします。
既存のアプリケーションをデプロイするには、代わりに「Heroku のデプロイ用にコードベースを準備する」の記事に従ってください。
コードのローカルバージョンを取得するために、サンプルアプリケーションを複製します。以下のコマンドをローカルのコマンドシェルまたはターミナルで実行します。
$ git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started
これで、Web フレームワーク Django を使用する、シンプルな Python アプリが入った正常な Git リポジトリを作成できました。これには、使用する Python バージョンを指定する .python-version
ファイルと、Python の依存関係マネージャー pip によって使用される requirements.txt
が含まれています。
Procfile を定義する
Procfile は、アプリケーションのルートディレクトリにあるテキストファイルです。このファイルを使って、アプリの起動時に実行するコマンドを明示的に宣言します。
サンプルアプリの Procfile
は、次のようになっています。
web: gunicorn --config gunicorn.conf.py gettingstarted.wsgi
この Procfile では、プロセスタイプ web
と、その実行に必要なコマンドを宣言しています。web
という名前は、このプロセスタイプが Heroku の HTTP ルーティングスタックにアタッチし、デプロイ後に Web トラフィックを受信することを宣言しているため重要です。ここで使われているコマンドは、Gunicorn (Web サーバー) を実行し、設定ファイルを渡しています。
Procfile には追加のプロセスタイプを含めることができます。たとえば、キューからアイテムを取り出して処理するバックグラウンドワーカープロセスを宣言できます。
Microsoft Windows
サンプルアプリには、Microsoft Windows でローカル開発を行うための追加 Procfile
があり、ファイル Procfile.windows
内に配置されています。チュートリアルの後半のステップでは、代わりにこの Procfile を使用して、Windows と互換性のある別の Web サーバーを起動します。
web: python manage.py runserver %PORT%
アプリを作成してデプロイする
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。詳細は、こちらを参照してください。資格のある学生の皆様は、Heroku for GitHub Students プログラムを通じてプラットフォームクレジットを申請できます。
Heroku でソースコードを受け取る準備をするには、アプリを作成します。
$ heroku create
Creating app... done, ⬢ serene-caverns-82714
https://serene-caverns-82714.herokuapp.com/ | https://git.heroku.com/serene-caverns-82714.git
アプリを作成すると、heroku
という名前の Git リモートリポジトリも作成され、ローカルの Git リポジトリと関連付けられます。Git リモートは、他のサーバー上で稼働するリポジトリのバージョンです。アプリに関連付けられた、Heroku でホストされる特別なリモートにコードをプッシュすることにより、アプリをデプロイします。
Heroku によってランダムなアプリ名 (このケースでは serene-caverns-82714
) が生成されます。独自のアプリ名を指定できます。
コードをデプロイします。このコマンドは、サンプルリポジトリの main
ブランチを heroku
リモートにプッシュし、次に Heroku にデプロイします。
$ git push heroku main
Enumerating objects: 673, done.
Counting objects: 100% (673/673), done.
Delta compression using up to 10 threads
Compressing objects: 100% (315/315), done.
Writing objects: 100% (673/673), 141.61 KiB | 141.61 MiB/s, done.
Total 673 (delta 305), reused 673 (delta 305), pack-reused 0
remote: Resolving deltas: 100% (305/305), done.
remote: Updated 30 paths from a933377
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-24 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Python app detected
remote: -----> Using Python 3.13 specified in .python-version
remote: -----> Installing Python 3.13.0
remote: -----> Installing pip 24.0
remote: -----> Installing dependencies using 'pip install -r requirements.txt'
remote: Collecting django<5.2,>=5.1 (from -r requirements.txt (line 1))
remote: Downloading Django-5.1.3-py3-none-any.whl.metadata (4.2 kB)
remote: Collecting gunicorn<24,>=23 (from -r requirements.txt (line 2))
remote: Downloading gunicorn-23.0.0-py3-none-any.whl.metadata (4.4 kB)
remote: Collecting dj-database-url<3,>=2 (from -r requirements.txt (line 3))
remote: Downloading dj_database_url-2.3.0-py3-none-any.whl.metadata (12 kB)
remote: Collecting whitenoise<7,>=6 (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote: Downloading whitenoise-6.8.2-py3-none-any.whl.metadata (3.6 kB)
remote: Collecting asgiref<4,>=3.8.1 (from django<5.2,>=5.1->-r requirements.txt (line 1))
remote: Downloading asgiref-3.8.1-py3-none-any.whl.metadata (9.3 kB)
remote: Collecting sqlparse>=0.3.1 (from django<5.2,>=5.1->-r requirements.txt (line 1))
remote: Downloading sqlparse-0.5.2-py3-none-any.whl.metadata (3.9 kB)
remote: Collecting packaging (from gunicorn<24,>=23->-r requirements.txt (line 2))
remote: Downloading packaging-24.2-py3-none-any.whl.metadata (3.2 kB)
remote: Collecting typing-extensions>=3.10.0.0 (from dj-database-url<3,>=2->-r requirements.txt (line 3))
remote: Downloading typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)
remote: Collecting brotli (from whitenoise[brotli]<7,>=6->-r requirements.txt (line 4))
remote: Downloading Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.5 kB)
remote: Downloading Django-5.1.3-py3-none-any.whl (8.3 MB)
remote: Downloading gunicorn-23.0.0-py3-none-any.whl (85 kB)
remote: Downloading dj_database_url-2.3.0-py3-none-any.whl (7.8 kB)
remote: Downloading whitenoise-6.8.2-py3-none-any.whl (20 kB)
remote: Downloading asgiref-3.8.1-py3-none-any.whl (23 kB)
remote: Downloading sqlparse-0.5.2-py3-none-any.whl (44 kB)
remote: Downloading typing_extensions-4.12.2-py3-none-any.whl (37 kB)
remote: Downloading Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB)
remote: Downloading packaging-24.2-py3-none-any.whl (65 kB)
remote: Installing collected packages: brotli, whitenoise, typing-extensions, sqlparse, packaging, asgiref, gunicorn, django, dj-database-url
remote: Successfully installed asgiref-3.8.1 brotli-1.1.0 dj-database-url-2.3.0 django-5.1.3 gunicorn-23.0.0 packaging-24.2 sqlparse-0.5.2 typing-extensions-4.12.2 whitenoise-6.8.2
remote: -----> $ python manage.py collectstatic --noinput
remote: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
remote: 1 static file copied to '/tmp/build_7b27a40d/staticfiles', 1 post-processed.
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 28.3M
remote: -----> Launching...
remote: Released v3
remote: https://serene-caverns-82714.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/serene-caverns-82714.git
* [new branch] main -> main
これでアプリのデプロイは完了です。アプリのインスタンスが 1 つ以上実行されていることを確認します。
$ heroku ps:scale web=1
ps:scale
の実行時にエラー Couldn't find that process type (web)
が表示された場合は、アプリがまだデプロイ中であることを意味します。数分待ってから、再試行してください。
ログに示されている URL でアプリにアクセスします。次のショートカットを使って Web サイトを開くこともできます。
$ heroku open
ログを表示する
Heroku では、すべてのアプリと Heroku のコンポーネントの出力ストリームから集約した時系列イベントのストリームとして、ログが扱われます。Heroku は、すべてのイベントに単一のストリームを提供します。実行中のアプリに関する情報を表示するには、ログコマンドの 1 つである以下を使います。
$ heroku logs --tail
2024-11-26T10:45:45.914677+00:00 heroku[web.1]: Starting process with command `gunicorn --config gunicorn.conf.py gettingstarted.wsgi`
2024-11-26T10:45:46.394639+00:00 app[web.1]: Python buildpack: Detected 512 MB available memory and 8 CPU cores.
2024-11-26T10:45:46.394711+00:00 app[web.1]: Python buildpack: Defaulting WEB_CONCURRENCY to 2 based on the available memory.
2024-11-26T10:45:46.646680+00:00 app[web.1]: WARNING:root:No DATABASE_URL environment variable set, and so no databases setup
2024-11-26T10:45:46.658628+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Starting gunicorn 23.0.0
2024-11-26T10:45:46.659030+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Listening at: http://[::]:45127 (2)
2024-11-26T10:45:46.659078+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [2] [INFO] Using worker: gthread
2024-11-26T10:45:46.661895+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [8] [INFO] Booting worker with pid: 8
2024-11-26T10:45:46.676834+00:00 app[web.1]: [2024-11-26 10:45:46 +0000] [9] [INFO] Booting worker with pid: 9
2024-11-26T10:45:47.011185+00:00 heroku[web.1]: State changed from starting to up
2024-11-26T10:45:57.197212+00:00 heroku[router]: at=info method=GET path="/" host=serene-caverns-82714.herokuapp.com request_id=6993babe-09d5-442c-b6be-099d82e7f38c fwd="123.456.789.0" dyno=web.1 connect=0ms service=10ms status=200 bytes=7809 protocol=https
ログメッセージをさらに生成するには、ブラウザでアプリのホームページを更新します。
ログのストリーム出力を停止するには、Control+C
を押します。
アプリをスケールする
サンプルアプリをデプロイすると、1 つの Web dyno で自動的に実行されます。dyno とは、Procfile
で指定されているコマンドを実行する軽量のコンテナのようなものです。
実行されている dyno の数を確認するには、ps
コマンドを使います。
$ heroku ps
Eco dyno hours quota remaining this month: 999h 50m (99%)
Eco dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Eco): gunicorn --config gunicorn.conf.py gettingstarted.wsgi (1)
web.1: up 2024/08/09 10:47:46 +0100 (~ 4m ago)
Heroku でアプリケーションをスケールするとは、実行中の dyno の数を変更することを意味します。Web dyno の数を 0 にスケールしてみます。
$ heroku ps:scale web=0
Scaling dynos... done, now running web at 0:Eco
ブラウザのタブで更新ボタンを押してアプリにアクセスするか、heroku open
コマンドを使ってブラウザのタブで開きます。リクエストに応答できる Web dyno がなくなったので、エラーメッセージが表示されます。
もう一度スケールしてみましょう。
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Eco
Eco にサブスクライブしている場合、アプリではデフォルトで Eco dyno が使用されます。それ以外の場合は、デフォルトで Basic dyno が使用されます。Eco dyno プランは、アカウントのすべての Eco dyno 間で共有され、多数の小さなアプリを Heroku にデプロイする場合にお勧めします。Eco dyno は 30 分間トラフィックを何も受信しないとスリープします。このスリープ動作により、スリープ解除した最初のリクエストで数秒の遅延が発生します。Eco dyno は、月ごとに割り当てられるアカウント別の Eco dyno 時間を消費します。割り当て時間が残っている限り、アプリは稼働し続けます。
dyno がスリープしないようにするには、「dyno タイプ」の記事で紹介されている Basic 以上の dyno タイプにアップグレードします。少なくとも Standard dyno にアップグレードすることで、プロセスタイプあたり複数の dyno にスケールアップできます。
アプリの依存関係をローカルでインストールする
Heroku では、主要なファイルを探すことでアプリを Python アプリとして認識します。Python アプリを認識する 1 つの方法は、ルートディレクトリに requirements.txt
を格納することです。
デプロイしたデモ用アプリには、事前に requirements.txt
が用意されています。
django>=5.1,<5.2
gunicorn>=23,<24
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7
requirements.txt
ファイルにはアプリの依存関係がリストされています。Heroku にアプリをデプロイすると、Python buildpack が pip install
コマンドを使用してこれらの依存関係をインストールします。
アプリをローカルで実行するには、依存関係もローカルでインストールする必要があります。
これを実行する前に、venv
とも呼ばれる仮想環境を作成してアクティブ化する必要があります。この環境を使用すると、システム Python のインストールに影響を与えずに、パッケージをインストールできます。
まず、ローカルの Python バージョンを確認します。
$ python3 --version
お使いの Python バージョンが 3.10 より古い場合は、仮想環境を作成する前に新しいバージョンの Python をインストールする必要があります。macOS、Windows、Linux の Python インストールガイドを参照してください。
次のコマンドで、サンプルアプリのディレクトリ内に仮想環境を作成します。
$ python3 -m venv --upgrade-deps .venv
次に、仮想環境をアクティブにします。
Microsoft Windows システム をご使用の場合は、次のコマンドでアクティブにします。
.\.venv\Scripts\activate
macOS/Linux システムをご使用の場合は、次のコマンドでアクティブにします。
$ source .venv/bin/activate
仮想環境の設定に関するヘルプについては、Python のドキュメントを参照してください。
最後に、新しく作成した環境に依存関係をインストールします。
$ pip install -r requirements.txt
依存関係をインストールすると、それらの依存関係もインストールされます。pip list
を使用して、インストールされているすべてのパッケージを表示します。
$ pip list
Package Version
----------------- -------
asgiref 3.8.1
Brotli 1.1.0
dj-database-url 2.3.0
Django 5.1.3
gunicorn 23.0.0
packaging 24.2
pip 24.3.1
sqlparse 0.5.2
typing_extensions 4.12.2
whitenoise 6.8.2
依存関係がインストールされたら、アプリをローカルで実行できます。
アプリをローカルで実行する
heroku local
コマンドを使ってアプリケーションをローカルで起動します。このコマンドは、Heroku CLI の一部です。
Microsoft Windows システム をご使用の場合は、次のコマンドを実行します。
$ heroku local --port 5006 -f Procfile.windows
macOS/Linux システムをご使用の場合は、次のコマンドを実行して、デフォルトの Procfile
を使用します。
$ heroku local --port 5006
コマンドを実行するとローカル Web サーバーが起動します。
[OKAY] Loaded ENV .env File as KEY=VALUE Format
11:01:34 AM web.1 | [2024-11-26 11:01:34 +0000] [12487] [INFO] Starting gunicorn 23.0.0
11:01:34 AM web.1 | [2024-11-26 11:01:34 +0000] [12487] [INFO] Listening at: http://[::]:5006 (12487)
11:01:34 AM web.1 | [2024-11-26 11:01:34 +0000] [12487] [INFO] Using worker: gthread
11:01:34 AM web.1 | [2024-11-26 11:01:34 +0000] [12488] [INFO] Booting worker with pid: 12488
heroku local
の実行中にエラーが表示される場合は、アプリの依存関係がローカルにインストールされており、仮想環境が引き続きアクティブになっていることを確認してください。
Heroku と同じように、heroku local
は Procfile
を使用して実行するコマンドを認識します。
Web ブラウザで http://localhost:5006 を開きます。ローカルで実行されているアプリが表示されます。
アプリのローカルでの実行を停止するには、ターミナルウィンドウに戻り、Ctrl
+ C
を押して終了します。
ローカルの変更をプッシュする
このステップでは、アプリケーションへのローカルでの変更を Heroku に反映させます。
requests
パッケージを requirements.txt
ファイルに追加します。
django>=5.1,<5.2
gunicorn>=23,<24
dj-database-url>=2,<3
whitenoise[brotli]>=6,<7
requests
pip を使用して requests
パッケージを更新された requirements.txt
ファイル経由でインストールします。
$ pip install -r requirements.txt
hello/views.py
を変更して、requests
モジュールと Django HttpResponse
クラスをファイルの上部にインポートします。
import requests
from django.http import HttpResponse
次に、モジュールを使用するように、index
メソッドを変更します。現在の index
メソッドを次のコードで置き換えてみます。
def index(request):
r = requests.get('https://httpbin.org/status/418', timeout=10)
return HttpResponse('<pre>' + r.text + '</pre>')
次にローカルで再びテストします。
Microsoft Windows システム をご使用の場合は、次のコマンドを実行します。
$ heroku local --port 5006 -f Procfile.windows
macOS/Linux システムをご使用の場合は、次のコマンドを実行して、デフォルトの Procfile
を使用します。
$ heroku local --port 5006
http://localhost:5006 からアプリケーションにアクセスします。変更が成功した場合は、https://httpbin.org/status/418 を取得したときの出力が表示されます。
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
ブラウザにエラー Internal Server Error
が表示され、ターミナルログ出力にエラー ModuleNotFoundError: No module named 'requests'
が表示されている場合、requests
パッケージが正常にインストールされたことを確認します。
次は、このローカルの変更を Heroku にデプロイします。
Heroku へのデプロイは、ほとんどの場合、このパターンで行います。まず、変更したファイルをローカルの Git リポジトリに追加します。
$ git add .
次に、変更内容をリポジトリにコミットします。
$ git commit -m "Updated index view"
次に、以前と同じようにデプロイします。
$ git push heroku main
最後に、すべて正常に動作しているかどうかを確認します。
$ heroku open
ログ記録アドオンをプロビジョニングする
アドオンは、アプリケーションですぐに使える追加サービスを提供するサードパーティのクラウドサービスです。永続性、ログ記録、モニタリングなど、さまざまなアドオンがあります。
Heroku では、デフォルトで 1500 行のアプリケーションログが記録されますが、完全なログストリームはサービスとして提供されています。複数のアドオンプロバイダーが、ログの永続化、検索、メールや SMS 通知などの機能を提供するログサービスを用意しています。
このステップでは、このようなログ関連アドオンの 1 つである、Papertrail をプロビジョニングします。
Papertrail ログ記録アドオンをプロビジョニングします。
$ heroku addons:create papertrail
Creating papertrail on ⬢ serene-caverns-82714... free
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging!
Created papertrail-convex-88929 as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation
アドオンがデプロイされ、アプリケーション用に設定されました。アプリのアドオンは、次のコマンドで一覧表示できます。
$ heroku addons
このアドオンが動作していることを確認するため、アプリケーションの Heroku URL に数回アクセスします。アクセスするたびにログメッセージが生成され、Papertrail のアドオンに送られます。Papertrail のコンソールにアクセスし、ログメッセージを確認します。
$ heroku addons:open papertrail
ブラウザで Papertrail の Web コンソールが開き、最新のログイベントが表示されます。このインターフェースでは、検索したり通知を設定したりできます。
コンソールを起動する
One-off dyno で、heroku run
コマンドを使ってコマンド (通常はアプリの一部を構成するスクリプトやアプリケーション) を実行できます。アプリの環境で試行するためにローカルターミナルにアタッチされた REPL プロセスを起動することもできます。
$ heroku run python manage.py shell
Running python manage.py shell on ⬢ serene-caverns-82714... up, run.9594 (Eco)
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Error connecting to process
というエラーが表示された場合は、ファイアウォールを設定します。
アプリとアプリのすべての依存関係の環境で Python シェルが実行されます。ここから、一部のアプリケーションファイルをインポートできます。たとえば、次のコードを実行できます。
>>> import requests
>>> r = requests.get('https://httpbin.org/status/418', timeout=10)
>>> print(r.text)
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
コマンド exit()
を実行して Python シェルを終了し、dyno を終了します。
別の例を試してみましょう。別の One-off dyno を作成し、bash
コマンドを実行して、その dyno でシェルを開きます。シェルが開いたら、そこでコマンドを実行できます。それぞれの dyno には専用の一時的ファイル領域があり、アプリとその依存関係が入力されています。コマンドが完了したら (このケースでは bash
)、dyno が終了します。:
$ heroku run bash
Running bash on ⬢ serene-caverns-82714... up, run.3789 (Eco)
~ $ ls -A
app.json .env .github hello manage.py Procfile.windows .python-version requirements.txt
.cache gettingstarted .gitignore .heroku Procfile .profile.d README.md staticfiles
~ $ exit
exit
コマンド exit
を実行して Bash シェルを終了し、dyno を終了します。
環境設定を定義する
Heroku では、暗号鍵や外部リソースのアドレスなどのデータを環境設定に保存して、設定を外部に置くことができます。
実行時に、環境設定が環境変数としてアプリケーションに公開されます。
hello/views.py
を編集します。ファイルの先頭に、os
モジュールをインポートする行を追加します。
import os
from django.http import HttpResponse
index
メソッドを編集し、環境変数 TIMES
の値に応じてあるアクションを繰り返し実行するようにします。
def index(request):
times = int(os.environ.get('TIMES', 3))
return HttpResponse('Hello! ' * times)
ローカルディレクトリにある .env
ファイルの内容に応じて、heroku local
コマンドによって環境が自動的に設定されます。サンプルプロジェクトのトップレベルディレクトリにはすでに .env
ファイルがあり、以下の行が含まれています。
TIMES=2
heroku local --port 5006
でアプリを実行して http://localhost:5006 にアクセスすると、「Hello!」と 2 回表示されます。
Heroku で環境設定を設定するには、次のコマンドを実行します。
$ heroku config:set TIMES=2
heroku config
を使用して、アプリの環境設定を表示します。
$ heroku config
=== serene-caverns-82714 Config Vars
PAPERTRAIL_API_TOKEN: <SECRET_TOKEN>
TIMES: 2
このアクションの変更を確認するには、変更したアプリケーションを Heroku にデプロイします。
データベースをプロビジョニングして使用する
add-on marketplace には、Redis や MongoDB、Postgres、MySQL など、多数のデータストアが揃っています。
essential-0
Postgres のサイズのコストは月額 5 ドルで、分単位で課金されます。このチュートリアルの最後で、データベースを削除して、コストを最小限に抑えるように求められます。
essential-0
Heroku Postgres アドオンをプロビジョニングするには、addons:create
コマンドを使用します。
$ heroku addons:create heroku-postgresql:essential-0
Creating heroku-postgresql:essential-0 on ⬢ serene-caverns-82714... ~$0.007/hour (max $5/month)
Database should be available soon
postgresql-deep-45610 is being created in the background. The app will restart when complete...
Use heroku addons:info postgresql-deep-45610 to check creation progress
Use heroku addons:docs heroku-postgresql to view documentation
CLI で addons
コマンドを使うと、アプリにプロビジョニングされたデータベースの詳細について確認できます。
$ heroku addons
Add-on Plan Price Max price State
───────────────────────────────────────── ─────────── ──────────── ───────── ────────
heroku-postgresql (postgresql-deep-45610) essential-0 ~$0.007/hour $5/month creating
└─ as DATABASE
...
アプリの環境設定を一覧表示すると、アプリがデータベースに接続するときに使用する URL (DATABASE_URL
) が表示されます。
$ heroku config
=== serene-caverns-82714 Config Vars
DATABASE_URL: postgres://ub3r5i9vnl3fnm:<PASSWORD>@c5p86clmevrg5s.cluster-czrs8kj4isg7.us-east-1.rds.amazonaws.com:5432/d10gkj42hdl30i
...
Heroku には、さらに詳細を表示する pg
コマンドもあります。
$ heroku pg
=== DATABASE_URL
Plan: essential-0
Status: Available
Connections: 0/20
PG Version: 16.2
Created: 2024-08-09 09:55
Data Size: 7.57 MB / 1 GB (0.74%) (In compliance)
Tables: 0/4000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
Add-on: postgresql-deep-45610
この情報は、essential-0
データベースが Postgres v16.2 を実行しており、テーブルがないことを示しています。
デプロイしたサンプルアプリにはすでにデータベース機能が備わっていますが、それを有効にするには、2 つの小さな変更を行う必要があります。
まず、requirements.txt
ファイルの末尾にある 2 行の psycopg
のコメントを解除します。
psycopg[c]; sys_platform == "linux"
psycopg[binary]; sys_platform != "linux"
これらの行により、ビルド時に、Postgres データベースアダプターパッケージがインストールされます。
次に、Procfile
ファイルの末尾にある release
プロセス行のコメントを解除します。
release: ./manage.py migrate --no-input
この release
プロセスエントリによって、Heroku リリースフェーズ機能が有効になり、それを使用して、アプリのデプロイ時に常に Django データベース移行が実行されます。
前と同じデプロイプロセスを使用して、変更したアプリケーションを Heroku にデプロイします。ビルド後に Django のデータベース移行が実行されることを確認できます。
remote: Running release command...
remote:
remote: Operations to perform:
remote: Apply all migrations: auth, contenttypes, hello, sessions
remote: Running migrations:
remote: Applying contenttypes.0001_initial... OK
remote: Applying contenttypes.0002_remove_content_type_name... OK
remote: Applying auth.0001_initial... OK
remote: Applying auth.0002_alter_permission_name_max_length... OK
remote: Applying auth.0003_alter_user_email_max_length... OK
remote: Applying auth.0004_alter_user_username_opts... OK
remote: Applying auth.0005_alter_user_last_login_null... OK
remote: Applying auth.0006_require_contenttypes_0002... OK
remote: Applying auth.0007_alter_validators_add_error_messages... OK
remote: Applying auth.0008_alter_user_username_max_length... OK
remote: Applying auth.0009_alter_user_last_name_max_length... OK
remote: Applying auth.0010_alter_group_name_max_length... OK
remote: Applying auth.0011_update_proxy_permissions... OK
remote: Applying auth.0012_alter_user_first_name_max_length... OK
remote: Applying hello.0001_initial... OK
remote: Applying sessions.0001_initial... OK
remote: Waiting for release.... done.
ビルドが settings.DATABASES is improperly configured
エラーで失敗した場合は、デプロイの前にデータベースアドオンをプロビジョニングしていることを確認します。
アプリの URL にアクセスし、/db
を追加して、データベースデモンストレーションページにアクセスします。たとえば、アプリが https://serene-caverns-82714.herokuapp.com/
にデプロイされている場合は、https://serene-caverns-82714.herokuapp.com/db
にアクセスします。
再度 /db
ルートにアクセスすると、アクセスするたびにシンプルなページの更新が表示されます。
Page View Report
Aug. 9, 2024, 10:07 a.m.
Aug. 9, 2024, 10:08 a.m.
データベースにアクセスするためのコードは簡単です。これは Greetings
というシンプルな Django モデルを使用しており、hello/models.py
にあります。
アプリの /db
ルートにアクセスするたびに hello/views.py
ファイル内の次のメソッドが呼び出され、挨拶が作成されます。次に、既存のすべての挨拶がレンダリングされます。
def db(request):
greeting = Greeting()
greeting.save()
greetings = Greeting.objects.all()
return render(request, 'db.html', {'greetings': greetings})
Postgres がローカルでインストールされている場合、heroku pg:psql
コマンドを使ってリモートデータベースに接続し、すべての行を表示します。
$ heroku pg:psql
--> Connecting to postgresql-deep-45610
...
Type "help" for help.
serene-caverns-82714::DATABASE=>
詳細は、「Heroku PostgreSQL」を参照してください。
同様のテクニックを使用して、MongoDB または Redis アドオンをインストールできます。
次のステップ
ここまで、アプリのデプロイ、アプリの設定変更、ログの表示、スケール、アドオンのアタッチを行う方法を説明しました。
次にお勧めするリソースを紹介します。
- 「Heroku の仕組み」では、アプリケーションの作成、設定、デプロイ、および実行時に必要な技術的な概念の概要を紹介しています。
- 既存の Python または Django アプリを Heroku にデプロイするには、「Heroku での Python および Django アプリのデプロイ」を参照してください。
- Python アプリケーションの開発とデプロイの詳細については、Python カテゴリを参照してください。
コストを抑制するために、チュートリアルを完了したらすぐにサンプルアプリを削除し、データベースも削除してください。
アプリとアドオンを削除する
アカウントからアプリとデータベースを削除します。使用したリソースに対してのみ課金されます。
この操作により、アドオンとデータベースに保存されたすべてのデータが削除されます。
$ heroku addons:destroy heroku-postgresql
この操作により、アプリケーションが完全に削除されます。
$ heroku apps:destroy
以下のコマンドによって、アドオンとアプリが消去されたことを確認できます。
$ heroku addons --all
$ heroku apps --all